Use case: DMA channel peripheral transfer in circular mode

Sequence diagram

Peripheral transfer in circular mode.

  @startuml
  hide footbox
  participant "User Application" as part1
  participant "PPP Driver"       as part4
  participant "DMA Driver"       as part3
  participant "NVIC"             as part5

  group Configuration
  part1->part3 : HAL_DMA_Init()
  part1->part3 : HAL_DMAEx_List_Init()
  end

  group Process
      group  Start
          part1->part4 : **Start PPP DMA process**
      end

      group  Repeated until PPP stop DMA
          part4->part3 : HAL_DMAEx_List_Start_IT()
          part5->part3 : HAL_DMA_IRQHandler()
          part3->part4 : PPP DMA transfer callback
          part4->part1 : <b>User PPP process callback
      end
      part1->part4 : **Stop PPP DMA process**
      part4->part3 : HAL_DMA_Abort_IT()
      part3->part4 : HAL_DMA_RegisterCallback(AbortCallback)
      part4->part1 : User callback()
  end

  @enduml

Note

The DMA start and stop procedures must be adjusted according to the selected peripheral (PPP).

Code snippet

The following code snippet is an example of I2C DMA transfer in circular mode.

HAL1

HAL2

HAL_DMA_Init(&handle_GPDMA1_Channe0);
HAL_DMAEx_List_Init(&handle_GPDMA1_Channe0);
HAL_DMA_Init(&hdma1, GPDMA1_CH0);
HAL_DMA_SetConfigPeriphLinkedListCircularXfer(&hdma1, &DMA_Node_I2C1_TX, &xfer_cfg_i2c1_tx_dma);

Key changes

  1. HAL2 configures circular peripheral transfers using HAL_DMA_SetConfigPeriphLinkedListCircularXfer().

  2. HAL2 starts the peripheral transfer using HAL_DMA_StartPeriphXfer_IT_Opt().

  3. Abort and IRQ handling remain based on HAL_DMA_Abort_IT() and HAL_DMA_IRQHandler().